﻿Imports System.IO
Public Class Gestion
    ' Los comentarios que van con ''' son los que aparecen cuando usamos el método fuera de la clase (para darnos más información)
    Private ruta As String = My.Application.Info.DirectoryPath & "\Fichero"
    Private nombreFicheroProductos As String = ruta & "\Productos.txt"
    Private ListaProductos As List(Of Producto)
    Public ReadOnly Property Productos As ObjectModel.ReadOnlyCollection(Of Producto)
        Get
            Return ListaProductos.AsReadOnly
        End Get
    End Property
    Public Sub New()
        ' Si no existe la carpeta Fichero la crea
        ' Si no existe el fichero Productos.txt o está vacío (no tiene ningún producto) crea 3 Productos, Café e infusiones, Agua mineral y Refresco (con sus respectivos precios) y los Graba en el fichero
        Try
            If Not File.Exists(nombreFicheroProductos) Then
                ListaProductos = New List(Of Producto) From {New Producto("Café e infusiones", 1.2), New Producto("Agua mineral", 0.8), New Producto("Refresco", 1.7)}
                Grabar()
            Else
                Dim fichero As New StreamReader(nombreFicheroProductos)
                If fichero.EndOfStream Then
                    ListaProductos = New List(Of Producto) From {New Producto("Café e infusiones", 1.2), New Producto("Agua mineral", 0.8), New Producto("Refresco", 1.7)}
                    Grabar()
                End If
                Do Until fichero.EndOfStream
                    Try
                        Dim linea As String = fichero.ReadLine
                        Dim contenidoLinea() As String = linea.Split("*")
                        If ListaProductos Is Nothing Then
                            ListaProductos = New List(Of Producto)
                        End If
                        Dim nuevoProducto As New Producto(contenidoLinea(0), contenidoLinea(1))
                        ListaProductos.Add(nuevoProducto)
                    Catch ex As IOException
                        fichero.Close()
                        ListaProductos = New List(Of Producto) From {New Producto("Café e infusiones", 1.2), New Producto("Agua mineral", 0.8), New Producto("Refresco", 1.7)}
                        Grabar()
                    Catch ex As Exception
                        fichero.Close()
                        ListaProductos = New List(Of Producto) From {New Producto("Café e infusiones", 1.2), New Producto("Agua mineral", 0.8), New Producto("Refresco", 1.7)}
                        Grabar()
                    End Try
                Loop
                fichero.Close()
            End If
        Catch ex As DirectoryNotFoundException
            Directory.CreateDirectory(ruta)
        Catch es As Exception

        End Try
    End Sub
    Public Function Añadir(ByVal nombreProd As String, ByVal precioProd As Decimal) As String
        Dim nuevoProducto As New Producto(nombreProd, precioProd)
        If nombreProd <> "" AndAlso precioProd > 0 AndAlso Not ListaProductos.Contains(nuevoProducto) Then
            ListaProductos.Add(nuevoProducto)
            Grabar()
            Return ""
        End If
        Return "No se ha podido añadir el producto"
    End Function
    ''' <summary>
    ''' Añade un producto a los existentes, siempre que sea válido
    ''' </summary>
    ''' <param name="prod">Debe ser un objeto con datos válidos en Nombre y Precio</param>
    ''' <returns> Devuelve un mensaje con el error o "" si todo ha ido bien</returns>
    ''' <remarks></remarks>

    Public Function Añadir(ByVal prod As Producto) As String
        ' Añade un nuevo producto a los existentes controlando que no existiera previamente. Si lo hace se quedará grabado en el fichero
        If prod Is Nothing Then Return "No hay producto"
        Return Añadir(prod.Nombre, prod.Precio)
    End Function
    ''' <summary>
    ''' Borra el producto que se corresponda con ese nombre, siempre que exista
    ''' </summary>
    ''' <param name="nombre"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Borrar(ByVal nombre As String) As String
        ' Borra el producto que se corresponda con ese nombre, siempre que exista. Si lo consigue deberemos hacer que ya no esté en el fichero
        Dim prod As New Producto(nombre, 0)
        If Not ListaProductos.Contains(prod) Then Return "No existe ese producto"
        ListaProductos.Remove(prod)
        Grabar()
        Return ""
    End Function
    
    ''' <summary>
    ''' Intenta grabar todos los Productos en el fichero producto.txt. Si hay algún error devuelve mensaje
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function Grabar() As String
        ' Es privada, porque grabo al Añadir y al Borrar desde aquí. El/la usuaria de la clase no necesita saberlo
        Dim ficheroProductos As StreamWriter = File.CreateText(nombreFicheroProductos)
        For i As Integer = 0 To ListaProductos.Count - 1
            ficheroProductos.WriteLine(ListaProductos(i).Nombre & "*" & ListaProductos(i).Precio)
        Next
        ficheroProductos.Close()
        Return ""
    End Function
End Class
